#include<iostream>
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<signal.h>
using namespace std;


void showBlock(sigset_t* oset)
{
    int signo=1;
    while(signo<=31)
    {
        if(sigismember(oset,signo)) cout<<"1";
        else cout<<"0";
        signo++;
    }
    cout<<endl;
}
int main()
{
    //只是在用户层面设置，没有设置入进程中
    sigset_t set,oset;
    sigemptyset(&set);
    sigemptyset(&oset);
    sigaddset(&set,2);//SIGINT

    //设置入进程中
    sigprocmask(SIG_SETMASK,&set,&oset);//更改进程的block位图，将2号信号屏蔽

    int cnt=0;
    while(true)
    {
        showBlock(&oset);
        sleep(1);
        cnt++;
        if(cnt==10)
        {
            cout<<"recover block"<<endl;
            sigprocmask(SIG_SETMASK,&oset,&set);
            showBlock(&set);
        }
    }

    // int a=10;
    // a/=0;
    // cout<<"div zero...here"<<endl;
    // return 0;

    // int* p=nullptr;
    // //p=100;
    // *p=100;
    // return 0;
    // pid_t id=fork();
    // if(id==0)
    // {
    //     //child
    //     sleep(2);
    //     cout<<"野指针问题。。。。"<<endl;
    //     int* p=nullptr;
    //     *p=100;
    //     cout<<"野指针问题。。。"<<endl;
    //     exit(0);
    // }
    // int status=0;
    // waitpid(id,&status,0);
    // cout<<"exit code: "<<((status>>8)& 0xff)<<endl;//对出信号次低8位退出码
    // cout<<"exit signal: "<<(status& 0x7f)<<endl;
    // cout<<"core dump flag: "<<((status>>7)& 0x1)<<endl;




    return 0;
}
